home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / evaltrac.lha / mf / et.mf < prev    next >
Text File  |  1989-11-29  |  18KB  |  626 lines

  1. % Evaltrace font, based on the Computer Modern family.
  2. % See "Visualizing Evaluation in Applicative Languages",
  3. %   by David S. Touretzky and Peter Lee
  4. % Copyright 1989 by Peter Lee and David S. Touretzky
  5. % School of Computer Science
  6. % Carnegie Mellon University
  7. %
  8. % Disclaimer:  This font was hackedup by someone who doesn't know anything
  9. % about font creation or Metafont.
  10. %
  11. % Please send improvements and bug fixes to:
  12. %   Peter.Lee@cs.cmu.edu   or   David.Touretzky@cs.cmu.edu
  13.  
  14. mode_setup; font_setup;
  15.  
  16. autorounding:=1;
  17. define_pixels(thick_rule_thickness,xarrowhead,yarrowhead,vmeet_adj,hmeet_adj);
  18.  
  19. def beginevt(expr code) =
  20.  beginchar(code, 18u#, body_height#, desc_depth#);
  21. enddef;
  22.  
  23. def draw_thin_hrule =
  24.  adjust_fit(0,0); pickup rule.nib;
  25.  x1=0-hmeet_adj; x2=w+hmeet_adj;
  26.  y1=y2=good.y math_axis;
  27.  draw z1--z2;
  28. enddef;
  29.  
  30. def draw_dashed_hrule =
  31.  adjust_fit(0,0); pickup rule.nib;
  32.  y1=y2=y3=y4=math_axis;
  33.  numeric t; t=w/4+hmeet_adj;
  34.  x1=0; x2=t; x3=2t; x4=3t;
  35.  drawdot z1; drawdot z2; drawdot z3; drawdot z4;
  36. enddef;
  37.  
  38. %%%%%%%%%%%%%%%%%%
  39. % Vertical rules %
  40. %%%%%%%%%%%%%%%%%%
  41.  
  42. cmchar "Thin vertical rule";
  43. beginevt("|");
  44.  adjust_fit(0,0); pickup rule.nib;
  45.  x1=x2=good.x .5w; y1=h+vmeet_adj; y2=-d-vmeet_adj;
  46.  draw z1--z2;
  47.  labels(1,2); endchar;
  48.  
  49. cmchar "Thick vertical rule";
  50. beginevt("*");
  51.  adjust_fit(0,0); pickup fine.nib;
  52.  lft x1=lft x4=.5w-thick_rule_thickness;
  53.  rt x2=rt x3=.5w+thick_rule_thickness;
  54.  y1=y2=h+vmeet_adj; y3=y4=-d-vmeet_adj;
  55.  filldraw z1--z2--z3--z4--cycle;
  56.  labels(1,2,3,4); endchar;
  57.  
  58. cmchar "Hollow vertical rule";
  59. beginevt("%");
  60.  adjust_fit(0,0); pickup crisp.nib;
  61.  lft x1=lft x4=(good.x .5w) - thick_rule_thickness;
  62.  rt x2=rt x3=(good.x .5w) + thick_rule_thickness;
  63.  y1=y2=h+vmeet_adj; y3=y4=-d-vmeet_adj;
  64.  draw z1--z4; draw z2--z3;
  65.  labels(1,2,3,4); endchar;
  66.  
  67. cmchar "Dashed vertical rule";
  68. beginevt(":");
  69.  adjust_fit(0,0); pickup rule.nib;
  70.  x1=x2=x3=x4=x5=x6=x7=good.x .5w;
  71.  numeric t; t=(h+d+2vmeet_adj)/7;
  72.  numeric b; b=-d-vmeet_adj;
  73.  y1=b; y2=b+t; y3=b+2t; y4=b+3t; y5=b+4t; y6=b+5t; y7=b+6t;
  74.  drawdot z1; drawdot z2; drawdot z3; drawdot z4;
  75.  drawdot z5; drawdot z6; drawdot z7;
  76.  labels(1,2,3,4,5,6,7); endchar;
  77.  
  78. cmchar "Hollow vertical rule meeting thin";
  79. beginevt("/");
  80.  adjust_fit(0,0); pickup crisp.nib;
  81.  lft x1=lft x4=(good.x .5w) - thick_rule_thickness - crisp;
  82.  x5=(good.x .5w) - thick_rule_thickness - crisp;
  83.  rt x2=rt x3=(good.x .5w) + thick_rule_thickness - crisp;
  84.  y1=y2=h+vmeet_adj; y3=y4=-d-vmeet_adj;
  85.  draw z1--z4; draw z2--z3;
  86.  pickup rule.nib;
  87.  y5=y6=math_axis; x6=0-hmeet_adj;
  88.  draw z5--z6;
  89.  labels(1,2,3,4,5,6); endchar;
  90.  
  91. cmchar "Hollow vertical rule meeting dashed";
  92. beginevt("?");
  93.  adjust_fit(0,0); pickup crisp.nib;
  94.  lft x1=lft x4=(good.x .5w) - thick_rule_thickness - crisp;
  95.  rt x2=rt x3=(good.x .5w) + thick_rule_thickness - crisp;
  96.  y1=y2=h+vmeet_adj; y3=y4=-d-vmeet_adj;
  97.  draw z1--z4; draw z2--z3;
  98.  pickup rule.nib;
  99.  y5=y6=math_axis;
  100.  numeric t; t=w/4+hmeet_adj;
  101.  x5=0; x6=t;
  102.  drawdot z5; drawdot z6;
  103.  labels(1,2,3,4,5,6); endchar;
  104.  
  105. cmchar "Thin vertical rule meeting dashed";
  106. beginevt("'");
  107.  adjust_fit(0,0); pickup rule.nib;
  108.  y4=y5=y6=math_axis;
  109.  numeric t; t=w/4+hmeet_adj;
  110.  x4=0; x5=t;
  111.  drawdot z4; drawdot z5;
  112.  x1=x2=(good.x .5w) - crisp; y1=h+vmeet_adj; y2=-d-vmeet_adj;
  113.  draw z1--z2;
  114.  labels(1,2,4,5); endchar;
  115.  
  116. %%%%%%%%%%%%%%%%%%%%
  117. % Horizontal rules %
  118. %%%%%%%%%%%%%%%%%%%%
  119.  
  120. cmchar "Thin horizontal rule";
  121. beginevt("-");
  122.  draw_thin_hrule;
  123.  labels(1,2); endchar;
  124.  
  125. cmchar "Thick horizontal rule";
  126. beginevt("_");
  127.  adjust_fit(0,0); pickup fine.nib;
  128.  x1=x4=0-hmeet_adj; x2=x3=w+hmeet_adj;
  129.  top y1=top y2=math_axis+thick_rule_thickness;
  130.  bot y3=bot y4=math_axis-thick_rule_thickness;
  131.  filldraw z1--z2--z3--z4--cycle;
  132.  labels(1,2,3,4); endchar;
  133.  
  134. cmchar "Hollow horizontal rule";
  135. beginevt("=");
  136.  adjust_fit(0,0); pickup crisp.nib;
  137.  x1=x4=0-hmeet_adj; x2=x3=w+hmeet_adj;
  138.  top y1=top y2=math_axis + thick_rule_thickness;
  139.  bot y3=bot y4=math_axis - thick_rule_thickness;
  140.  draw z1--z2; draw z3--z4;
  141.  labels(1,2,3,4); endchar;
  142.  
  143. cmchar "Dashed horizontal rule";
  144. beginevt(".");
  145.  draw_dashed_hrule;
  146.  labels(1,2,3,4); endchar;
  147.  
  148. %%%%%%%%%%%%%%%%%
  149. % Crossed lines %
  150. %%%%%%%%%%%%%%%%%
  151.  
  152. cmchar "Crossed thin rule";
  153. beginevt("+");
  154.  draw_thin_hrule;
  155.  x3=x4=x5=x6=good.x .5w;
  156.  y3=h+vmeet_adj; bot y4=math_axis + thick_rule_thickness;
  157.  y6=-d-vmeet_adj; top y5=math_axis - thick_rule_thickness;
  158.  draw z3--z4; draw z5--z6;
  159.  labels(1,2,3,4,5,6); endchar;
  160.  
  161. cmchar "Crossed thick rule";
  162. beginevt("#");
  163.  draw_thin_hrule;
  164.  lft x3=lft x6=lft x7=lft x10=.5w-thick_rule_thickness;
  165.  rt x4=rt x5=rt x8=rt x9=.5w+thick_rule_thickness;
  166.  y3=y4=h+vmeet_adj;
  167.  bot y5=bot y6=math_axis+thick_rule_thickness;
  168.  y9=y10=-d-vmeet_adj;
  169.  top y7=top y8=math_axis-thick_rule_thickness;
  170.  filldraw z3--z4--z5--z6--cycle;
  171.  filldraw z7--z8--z9--z10--cycle;
  172.  labels(1,2,3,4,5,6,7,8,9,10); endchar;
  173.  
  174. cmchar "Crossed hollow rule";
  175. beginevt("H");
  176.  draw_thin_hrule;
  177.  pickup crisp.nib;
  178.  lft x3=lft x6=lft x7=lft x10=(good.x .5w) - thick_rule_thickness;
  179.  rt x4=rt x5=rt x8=rt x9=(good.x .5w) + thick_rule_thickness;
  180.  y3=y4=h+vmeet_adj; bot y5=bot y6=math_axis + thick_rule_thickness;
  181.  y9=y10=-d-vmeet_adj; top y7=top y8=math_axis - thick_rule_thickness;
  182.  draw z3--z6; draw z4--z5;
  183.  draw z7--z10; draw z8--z9;
  184.  labels(1,2,3,4,5,6,7,8,9,10); endchar;
  185.  
  186. cmchar "Crossed dashed rule";
  187. beginevt("h");
  188.  draw_thin_hrule;
  189.  x3=x4=x5=x6=x7=x8=x9=good.x .5w;
  190.  numeric t; t=(h+d+2vmeet_adj)/7;
  191.  numeric b; b=-d-vmeet_adj;
  192.  y3=b; y4=b+t; y5=b+2t; y6=b+3t; y7=b+4t; y8=b+5t; y9=b+6t;
  193.  drawdot z3; drawdot z4; drawdot z5; drawdot z6;
  194.  drawdot z7; drawdot z8; drawdot z9;
  195.  labels(1,2,3,4,5,6,7,8,9); endchar;
  196.  
  197. cmchar "Dash-crossed thin rule";
  198. beginevt("x");
  199.  draw_dashed_hrule;
  200.  x7=x8=x9=x10=good.x .5w;
  201.  y7=h+vmeet_adj; bot y8=math_axis + thick_rule_thickness;
  202.  y10=-d-vmeet_adj; top y9=math_axis - thick_rule_thickness;
  203.  draw z7--z8; draw z9--z10;
  204.  labels(1,2,3,4,7,8,9,10); endchar;
  205.  
  206. cmchar "Dash-crossed thick rule";
  207. beginevt("X");
  208.  draw_dashed_hrule;
  209.  pickup fine.nib;
  210.  lft x7=lft x10=lft x11=lft x14=(good.x .5w) - thick_rule_thickness;
  211.  rt x8=rt x9=rt x12=rt x13=(good.x .5w) + thick_rule_thickness;
  212.  y7=y8=h+vmeet_adj; bot y9=bot y10=math_axis + thick_rule_thickness;
  213.  y13=y14=-d-vmeet_adj; top y11=top y12=math_axis - thick_rule_thickness;
  214.  filldraw z7--z8--z9--z10--cycle;
  215.  filldraw z11--z12--z13--z14--cycle;
  216.  labels(1,2,3,4,7,8,9,10,11,12,13,14); endchar;
  217.  
  218. cmchar "Dash-crossed hollow rule";
  219. beginevt("Y");
  220.  draw_dashed_hrule;
  221.  pickup crisp.nib;
  222.  lft x7=lft x10=lft x11=lft x14=(good.x .5w) - thick_rule_thickness;
  223.  rt x8=rt x9=rt x12=rt x13=(good.x .5w) + thick_rule_thickness;
  224.  y7=y8=h+vmeet_adj; bot y9=bot y10=math_axis + thick_rule_thickness;
  225.  y13=y14=-d-vmeet_adj; top y11=top y12=math_axis - thick_rule_thickness;
  226.  draw z7--z10; draw z8--z9;
  227.  draw z11--z14; draw z12--z13;
  228.  labels(1,2,3,4,7,8,9,10,11,12,13,14); endchar;
  229.  
  230. cmchar "Dash-crossed dashed rule";
  231. beginevt("y");
  232.  draw_dashed_hrule;
  233.  x5=x6=x7=x8=x9=x10=x11=x12=good.x .5w;
  234.  numeric t; t=(h+d+2vmeet_adj)/8;
  235.  numeric b; b=-d-vmeet_adj;
  236.  y5=b; y6=b+t; y7=b+2t; y8=b+3t; y9=b+4t; y10=b+5t; y11=b+6t; y12=b+7t;
  237.  drawdot z5; drawdot z6; drawdot z7; drawdot z8;
  238.  drawdot z9; drawdot z10; drawdot z11; drawdot z12;
  239.  labels(1,2,3,4,5,6,7,8,9,10,11,12); endchar;
  240. %enddef;
  241.  
  242. %%%%%%%%%%
  243. % Arrows %
  244. %%%%%%%%%%
  245.  
  246. cmchar "Thin rightward arrow";
  247. beginevt(">");
  248.  adjust_fit(0,0); pickup rule.nib;
  249.  x1=0-hmeet_adj; rt x2=x3=w-thick_rule_thickness;
  250.  y1=y2=y3=math_axis;
  251.  draw z1--z2; % stem
  252.  pickup crisp.nib;
  253.  z4=z3+(-xarrowhead,yarrowhead);
  254.  z5=z3+(-xarrowhead,-yarrowhead);
  255.  draw z3--z4; draw z3--z5; % arrowhead
  256.  labels(1,2,3,4,5); endchar;
  257.  
  258. cmchar "Thin leftward arrow";
  259. beginevt("<");
  260.  adjust_fit(0,0); pickup rule.nib;
  261.  x1=lft x2=thick_rule_thickness; x3=w+hmeet_adj;
  262.  y1=y2=y3=math_axis;
  263.  draw z2--z3; % stem
  264.  pickup crisp.nib;
  265.  z4=z1+(xarrowhead,yarrowhead);
  266.  z5=z1+(xarrowhead,-yarrowhead);
  267.  draw z1--z4; draw z1--z5; % arrowhead
  268.  labels(1,2,3,4,5); endchar;
  269.  
  270. cmchar "Thin upward arrow";
  271. beginevt("^");
  272.  adjust_fit(0,0); pickup rule.nib;
  273.  x1=x2=x3=good.x .5w;
  274.  y1=top y2=h-thick_rule_thickness; y3=-d-vmeet_adj;
  275.  draw z2--z3; % stem
  276.  pickup crisp.nib;
  277.  z4=z1+(xarrowhead,-yarrowhead);
  278.  z5=z1+(-xarrowhead,-yarrowhead);
  279.  draw z1--z4; draw z1--z5; % arrowhead
  280.  labels(1,2,3,4,5); endchar;
  281.  
  282. cmchar "Thin downward arrow";
  283. beginevt("V");
  284.  adjust_fit(0,0); pickup rule.nib;
  285.  x1=x2=x3=good.x .5w;
  286.  y1=bot y2=-d+thick_rule_thickness; y3=h+vmeet_adj;
  287.  draw z2--z3; % stem
  288.  pickup crisp.nib;
  289.  z4=z1+(xarrowhead,yarrowhead);
  290.  z5=z1+(-xarrowhead,yarrowhead);
  291.  draw z1--z4; draw z1--z5; % arrowhead
  292.  labels(1,2,3,4,5); endchar;
  293.  
  294. cmchar "Thick rightward arrow";
  295. beginevt("]");
  296.  adjust_fit(0,0); pickup fine.nib;
  297.  x1=x5=0-hmeet_adj; rt x3=x6=w-thick_rule_thickness;
  298.  rt x2=rt x4=(w-thick_rule_thickness)-(thick_rule_thickness);
  299.  top y1=top y2=math_axis+thick_rule_thickness;
  300.  bot y5=bot y4=math_axis-thick_rule_thickness;
  301.  y3=y6=math_axis;
  302.  filldraw z1--z2--z3--z4--z5--cycle; % stem
  303.  pickup crisp.nib;
  304.  z7=z6+(-xarrowhead,yarrowhead);
  305.  z8=z6+(-xarrowhead,-yarrowhead);
  306.  draw z6--z7; draw z6--z8; % arrowhead
  307.  labels(1,2,3,4,5,6,7,8); endchar;
  308.  
  309. cmchar "Hollow rightward arrow";
  310. beginevt("!");
  311.  adjust_fit(0,0); pickup crisp.nib;
  312.  x1=x5=0-hmeet_adj; x6=w-thick_rule_thickness;
  313.  x2=x4=(w-thick_rule_thickness)-(thick_rule_thickness);
  314.  top y1=top y2=math_axis + thick_rule_thickness;
  315.  bot y5=bot y4=math_axis - thick_rule_thickness;
  316.  y6=math_axis;
  317.  draw z1--z2; % stem
  318.  draw z5--z4;
  319.  z7=z6+(-xarrowhead,yarrowhead);
  320.  z8=z6+(-xarrowhead,-yarrowhead);
  321.  draw z6--z7; draw z6--z8; % arrowhead
  322.  labels(1,2,3,4,5,7,8); endchar;
  323.  
  324. cmchar "Dashed rightward arrow";
  325. beginevt(")");
  326.  adjust_fit(0,0); pickup rule.nib;
  327.  y1=y2=y3=y5=math_axis;
  328.  numeric t; t=w/4+hmeet_adj;
  329.  x1=0; x2=t; x3=2t;
  330.  x5=w-thick_rule_thickness;
  331.  drawdot z1; drawdot z2; drawdot z3; % stem
  332.  pickup crisp.nib;
  333.  z6=z5+(-xarrowhead,yarrowhead);
  334.  z7=z5+(-xarrowhead,-yarrowhead);
  335.  draw z5--z6; draw z5--z7; % arrowhead
  336.  labels(1,2,3,5,6,7); endchar;
  337.  
  338. cmchar "Dashed leftward arrow";
  339. beginevt("(");
  340.  adjust_fit(0,0); pickup rule.nib;
  341.  y1=y3=y4=y5=math_axis;
  342.  numeric t; t=w/4+hmeet_adj;
  343.  numeric b; b=thick_rule_thickness;
  344.  x1=b; x3=b+t; x4=b+2t; x5=b+3t;
  345.  drawdot z3; drawdot z4; drawdot z5; % stem
  346.  pickup crisp.nib;
  347.  z6=z1+(xarrowhead,yarrowhead);
  348.  z7=z1+(xarrowhead,-yarrowhead);
  349.  draw z1--z6; draw z1--z7; % arrowhead
  350.  labels(1,3,4,5,6,7); endchar;
  351.  
  352. cmchar "Dashed upward arrow";
  353.  beginevt("~");
  354.  adjust_fit(0,0); pickup rule.nib;
  355.  x1=x2=x3=x4=x6=good.x .5w;
  356.  numeric t; t=(h+d+2vmeet_adj)/7;
  357.  numeric b; b=-d-vmeet_adj;
  358.  y1=b; y2=b+t; y3=b+2t; y4=b+3t;
  359.  y6=h-thick_rule_thickness;
  360.  drawdot z1; drawdot z2; drawdot z3; drawdot z4; % stem
  361.  pickup crisp.nib;
  362.  z7=z6+(xarrowhead,-yarrowhead);
  363.  z8=z6+(-xarrowhead,-yarrowhead);
  364.  draw z6--z7; draw z6--z8; % arrowhead
  365.  labels(1,2,3,4,6,7,8); endchar;
  366.  
  367. cmchar "Dashed downward arrow";
  368. beginevt("v");
  369.  adjust_fit(0,0); pickup rule.nib;
  370.  x1=x2=x3=x4=x6=good.x .5w;
  371.  numeric t; t=(h+d+2vmeet_adj)/7;
  372.  numeric b; b=-d-vmeet_adj;
  373.  y1=b+3t; y2=b+4t; y3=b+5t; y4=b+6t;
  374.  y6=-d+thick_rule_thickness;
  375.  drawdot z1; drawdot z2; drawdot z3; drawdot z4; % stem
  376.  pickup crisp.nib;
  377.  z7=z6+(xarrowhead,yarrowhead);
  378.  z8=z6+(-xarrowhead,yarrowhead);
  379.  draw z6--z7; draw z6--z8; % arrowhead
  380.  labels(1,2,3,4,6,7,8); endchar;
  381.  
  382. %%%%%%%%%%
  383. % Elbows %
  384. %%%%%%%%%%
  385.  
  386. cmchar "Thin upper-left elbow";
  387. beginevt("q");
  388.  adjust_fit(0,0); pickup rule.nib;
  389.  x1=x2=good.x .5w; x3=w+hmeet_adj;
  390.  y1=-d-vmeet_adj; y2=y3=good.y math_axis;
  391.  draw z1--z2--z3;
  392.  labels(1,2,3); endchar;
  393.  
  394. cmchar "Thin upper-right elbow";
  395. beginevt("w");
  396.  adjust_fit(0,0); pickup rule.nib;
  397.  x1=x2=(good.x .5w) - crisp; x3=0-hmeet_adj;
  398.  y1=-d-vmeet_adj; y2=y3=math_axis;
  399.  draw z1--z2--z3;
  400.  labels(1,2,3); endchar;
  401.  
  402. cmchar "Thin lower-left elbow";
  403. beginevt("a");
  404.  adjust_fit(0,0); pickup rule.nib;
  405.  x1=x2=good.x .5w; x3=w+hmeet_adj;
  406.  y1=h+vmeet_adj; y2=y3=math_axis;
  407.  draw z1--z2--z3;
  408.  labels(1,2,3); endchar;
  409.  
  410. cmchar "Thin lower-right elbow";
  411. beginevt("s");
  412.  adjust_fit(0,0); pickup rule.nib;
  413.  x1=x2=(good.x .5w) - crisp; x3=0-hmeet_adj;
  414.  y1=h+vmeet_adj; y2=y3=math_axis;
  415.  draw z1--z2--z3;
  416.  labels(1,2,3); endchar;
  417.  
  418. cmchar "Thin upper-left elbow meeting dashed";
  419. beginevt("I");
  420.  adjust_fit(0,0); pickup rule.nib;
  421.  x1=x2=good.x .5w; x3=w+hmeet_adj;
  422.  y1=-d-vmeet_adj; y2=y3=math_axis;
  423.  draw z1--z2--z3; % elbow
  424.  x5=x6=x7=x8=good.x .5w;
  425.  numeric t; t=(h+d+2vmeet_adj)/8;
  426.  numeric b; b=-d-vmeet_adj;
  427.  y5=b+4t; y6=b+5t; y7=b+6t; y8=b+7t;
  428.  drawdot z5; drawdot z6; drawdot z7; drawdot z8;
  429.  labels(1,2,3,5,6,7,8); endchar;
  430.  
  431. cmchar "Thick upper-left elbow";
  432. beginevt("Q");
  433.  adjust_fit(0,0); pickup fine.nib;
  434.  lft x1=lft x2=.5w-thick_rule_thickness;
  435.  rt x5=rt x6=.5w+thick_rule_thickness;
  436.  x3=x4=w+hmeet_adj;
  437.  y1=y6=-d-vmeet_adj;
  438.  bot y4=bot y5=math_axis-thick_rule_thickness;
  439.  top y2=top y3=math_axis+thick_rule_thickness;
  440.  filldraw z1--z2--z3--z4--z5--z6--cycle;
  441.  labels(1,2,3,4,5,6); endchar;
  442.  
  443. cmchar "Thick upper-right elbow";
  444. beginevt("W");
  445.  adjust_fit(0,0); pickup fine.nib;
  446.  rt x1=rt x2=(good.x .5w) + thick_rule_thickness;
  447.  lft x5=lft x6=(good.x .5w) - thick_rule_thickness;
  448.  x3=x4=0-hmeet_adj;
  449.  y1=y6=-d-vmeet_adj;
  450.  bot y4=bot y5=math_axis - thick_rule_thickness;
  451.  top y2=top y3=math_axis + thick_rule_thickness;
  452.  filldraw z1--z2--z3--z4--z5--z6--cycle;
  453.  labels(1,2,3,4,5,6); endchar;
  454.  
  455. cmchar "Thick lower-left elbow";
  456. beginevt("A");
  457.  adjust_fit(0,0); pickup fine.nib;
  458.  lft x1=lft x2=(good.x .5w) - thick_rule_thickness;
  459.  rt x5=rt x6=(good.x .5w) + thick_rule_thickness;
  460.  x3=x4=w+hmeet_adj;
  461.  y1=y6=h+vmeet_adj;
  462.  top y4=top y5=math_axis + thick_rule_thickness;
  463.  bot y2=bot y3=math_axis - thick_rule_thickness;
  464.  filldraw z1--z2--z3--z4--z5--z6--cycle;
  465.  labels(1,2,3,4,5,6); endchar;
  466.  
  467. cmchar "Thick lower-right elbow";
  468. beginevt("S");
  469.  adjust_fit(0,0); pickup fine.nib;
  470.  rt x1=rt x2=(good.x .5w) + thick_rule_thickness;
  471.  lft x5=lft x6=(good.x .5w) - thick_rule_thickness;
  472.  x3=x4=0-hmeet_adj;
  473.  y1=y6=h+vmeet_adj;
  474.  top y4=top y5=math_axis + thick_rule_thickness;
  475.  bot y2=bot y3=math_axis - thick_rule_thickness;
  476.  filldraw z6--z5--z4--z3--z2--z1--cycle;
  477.  labels(1,2,3,4,5,6); endchar;
  478.  
  479. cmchar "Thick upper-left elbow meeting thin";
  480. beginevt("T");
  481.  adjust_fit(0,0); pickup fine.nib;
  482.  lft x1=lft x2=(good.x .5w) - thick_rule_thickness;
  483.  rt x5=rt x6=(good.x .5w) + thick_rule_thickness;
  484.  x3=x4=w+hmeet_adj;
  485.  y1=y6=-d-vmeet_adj;
  486.  bot y4=bot y5=math_axis - thick_rule_thickness;
  487.  top y2=top y3=math_axis + thick_rule_thickness;
  488.  filldraw z6--z5--z4--z3--z2--z1--cycle; % elbow
  489.  pickup rule.nib;
  490.  x7=x8=good.x .5w;
  491.  bot y7=math_axis; y8=h+vmeet_adj;
  492.  draw z7--z8;
  493.  labels(1,2,3,4,5,6,7,8); endchar;
  494.  
  495. cmchar "Hollow upper-left elbow";
  496. beginevt("E");
  497.  adjust_fit(0,0); pickup crisp.nib;
  498.  lft x1=lft x2=(good.x .5w) - thick_rule_thickness;
  499.  rt x5=rt x6=(good.x .5w) + thick_rule_thickness;
  500.  x3=x4=w+hmeet_adj;
  501.  y1=y6=-d-vmeet_adj;
  502.  bot y4=bot y5=math_axis - thick_rule_thickness;
  503.  top y2=top y3=math_axis + thick_rule_thickness;
  504.  draw z1--z2--z3;
  505.  draw z4--z5--z6;
  506.  labels(1,2,3,4,5,6); endchar;
  507.  
  508. cmchar "Hollow upper-right elbow";
  509. beginevt("R");
  510.  adjust_fit(0,0); pickup crisp.nib;
  511.  rt x1=rt x2=(good.x .5w) + thick_rule_thickness;
  512.  lft x5=lft x6=(good.x .5w) - thick_rule_thickness;
  513.  x3=x4=0-hmeet_adj;
  514.  y1=y6=-d-vmeet_adj;
  515.  bot y4=bot y5=math_axis - thick_rule_thickness;
  516.  top y2=top y3=math_axis + thick_rule_thickness;
  517.  draw z1--z2--z3;
  518.  draw z4--z5--z6;
  519.  labels(1,2,3,4,5,6); endchar;
  520.  
  521. cmchar "Hollow lower-left elbow";
  522. beginevt("D");
  523.  adjust_fit(0,0); pickup crisp.nib;
  524.  lft x1=lft x2=(good.x .5w) - thick_rule_thickness;
  525.  rt x5=rt x6=(good.x .5w) + thick_rule_thickness;
  526.  x3=x4=w+hmeet_adj;
  527.  y1=y6=h+vmeet_adj;
  528.  top y4=top y5=math_axis + thick_rule_thickness;
  529.  bot y2=bot y3=math_axis - thick_rule_thickness;
  530.  draw z1--z2--z3;
  531.  draw z4--z5--z6;
  532.  labels(1,2,3,4,5,6); endchar;
  533.  
  534. cmchar "Hollow lower-right elbow";
  535. beginevt("F");
  536.  adjust_fit(0,0); pickup crisp.nib;
  537.  rt x1=rt x2=(good.x .5w) + thick_rule_thickness;
  538.  lft x5=lft x6=(good.x .5w) - thick_rule_thickness;
  539.  x3=x4=0-hmeet_adj;
  540.  y1=y6=h+vmeet_adj;
  541.  top y4=top y5=math_axis + thick_rule_thickness;
  542.  bot y2=bot y3=math_axis - thick_rule_thickness;
  543.  draw z1--z2--z3;
  544.  draw z4--z5--z6;
  545.  labels(1,2,3,4,5,6); endchar;
  546.  
  547. cmchar "Hollow upper-left elbow meeting thin";
  548. beginevt("t");
  549.  adjust_fit(0,0); pickup crisp.nib;
  550.  lft x1=lft x2=(good.x .5w) - thick_rule_thickness;
  551.  rt x5=rt x6=(good.x .5w) + thick_rule_thickness;
  552.  x3=x4=w+hmeet_adj;
  553.  y1=y6=-d-vmeet_adj;
  554.  bot y4=bot y5=math_axis - thick_rule_thickness;
  555.  top y2=top y3=math_axis + thick_rule_thickness;
  556.  draw z1--z2--z3;
  557.  draw z4--z5--z6; % elbow
  558.  x7=x8=good.x .5w;
  559.  y7=math_axis + thick_rule_thickness; y8=h+vmeet_adj;
  560.  draw z7--z8;
  561.  labels(1,2,3,4,5,6,7,8); endchar;
  562.  
  563. cmchar "Dashed upper-left elbow";
  564. beginevt("e");
  565.  adjust_fit(0,0); pickup rule.nib;
  566.  x1=x2=x3=x4=good.x .5w;
  567.  numeric t; t=(h+d+2vmeet_adj)/7;
  568.  numeric b; b=-d-vmeet_adj;
  569.  y1=b; y2=b+t; y3=b+2t; y4=b+3t;
  570.  y6=y7=math_axis;
  571.  numeric s; s=w/4+hmeet_adj;
  572.  x6=2s; x7=3s;
  573.  drawdot z1; drawdot z2; drawdot z3;
  574.  drawdot z4; drawdot z6; drawdot z7;
  575.  labels(1,2,3,4,6,7); endchar;
  576.  
  577. cmchar "Dashed upper-right elbow";
  578. beginevt("r");
  579.  adjust_fit(0,0); pickup rule.nib;
  580.  x1=x2=x3=x4=good.x .5w;
  581.  numeric t; t=(h+d+2vmeet_adj)/7;
  582.  numeric b; b=-d-vmeet_adj;
  583.  y1=b; y2=b+t; y3=b+2t; y4=b+3t;
  584.  y7=y8=math_axis;
  585.  numeric s; s=w/4+hmeet_adj;
  586.  x7=s; x8=0;
  587.  drawdot z1; drawdot z2; drawdot z3; drawdot z4;
  588.  drawdot z7; drawdot z8;
  589.  labels(1,2,3,4,7,8); endchar;
  590.  
  591. cmchar "Dashed lower-left elbow";
  592. beginevt("d");
  593.  adjust_fit(0,0); pickup rule.nib;
  594.  x1=x2=good.x .5w;
  595.  numeric t; t=(h+d+2vmeet_adj)/7;
  596.  numeric b; b=-d-vmeet_adj;
  597.  y1=b+5t; y2=b+6t;
  598.  y5=y6=math_axis;
  599.  numeric s; s=w/4+hmeet_adj;
  600.  x5=2s; x6=3s;
  601.  drawdot z1; drawdot z2;
  602.  drawdot z5; drawdot z6;
  603.  labels(1,2,5,6); endchar;
  604.  
  605. cmchar "Dashed lower-right elbow";
  606. beginevt("f");
  607.  adjust_fit(0,0); pickup rule.nib;
  608.  x1=x2=good.x .5w;
  609.  numeric t; t=(h+d+2vmeet_adj)/7;
  610.  numeric b; b=-d-vmeet_adj;
  611.  y1=b+5t; y2=b+6t;
  612.  y5=y6=math_axis;
  613.  numeric s; s=w/4+hmeet_adj;
  614.  x5=s; x6=0;
  615.  drawdot z1; drawdot z2;
  616.  drawdot z5; drawdot z6;
  617.  labels(1,2,5,6); endchar;
  618.  
  619. %%%%%%%%%
  620. % Space %
  621. %%%%%%%%%
  622.  
  623. cmchar "Space";
  624. beginevt(" ");
  625.  endchar;
  626.